// 构建事件总线
class EventBus {
  // 核心，就是要完成 发布者要收集所有的订阅者的回调函数，在发布消息的同时触发订阅者的所有函数
  constructor() {
    this.handlers = {} // 收集所有回调函数
    /*
        handlers = {
            x: [fn1, fn2],
            y: [fn3]
        }
    */
  }
  // 构建on监听事件, callback 回调函数
  on = (e, callback) => {
    // 收集所有回调函数
    if (this.handlers[e]) {
      // 如果存在事件，说明已经有一个 [],
      this.handlers[e].push(callback)
    } else {
      this.handlers[e] = [callback]
    }
  }
  // emit触发事件
  // e 是自定义事件,val 是事件总线（发布者）要传递给订阅者的数据
  emit = (e, val) => {
    // 要求触发所有的回调函数
    // 如果没有这个事件，直接退出
    if (!this.handlers[e]) return
    // 存在事件，遍历触发所有事件
    this.handlers[e].forEach((ele) => {
      // ele 是每一个回调函数
      ele(val)
    })
  }
}

// on 监听事件
// emit 触发事件，就是要去执行触发事件中的全部的回调函数，同时，把参数交给函数去执行

export default new EventBus()
